iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 4
0

只做一件事情

主要作法先思考一整個流程需要做哪些動作,將每個動作拆開寫成一個一個方法。
最後在寫一個方法將整個動作流程串連起來。
這樣說明可能有些模糊,我們一樣用code來說明吧。
下面的範例是要尋找特定文件是否含有Hello world這個字串,假設檔案連存在都沒有的話就直接回傳false,如果有找到的話就回傳true

public boolean searchFileHaveHelloWorld() throws FileNotFoundException{
    String filePath = "xxx";
    File needChekFile = new File(filePath);
    boolean haveHelloWorld = false;
    if (needChekFile.exists()){
        Scanner fileScanner = new Scanner(needChekFile);
        String fileContent = "";
        while (fileScanner.hasNext()){
            fileContent = fileContent + fileScanner.nextLine();
        }
        fileContent = fileContent.replaceAll("\n", "");
        if (fileContent.matches(".*Hello world.*")){
            haveHelloWorld = true;
        }
    }
    return haveHelloWorld;
 }

在重構前我們先來看一下整個方法吧。
第3行建立file物件。
第5行透過file類別的方法確認檔案的存在。如果存在就做裡面的事情
第6行~第10行用來取得檔案內所有的文字內容。
第12行~第16行用來尋找hello world。
我們會發現在短短20行不到的code需要一次閱讀3到4行才知道它做了甚麼事情。接下來我們重構後在看看吧!

重構後

public boolean searchFileHaveHelloWorld() throws FileNotFoundException {
    String filePath = "xxx";
    File needChekFile = new File(filePath);
    boolean isFileHaveHelloWorld = false;
    if (checkFileExisits(needChekFile)){
        String fileContent = getFileContent(needChekFile);
        isFileHaveHelloWorld = checkStringHaveHelloWorld(fileContent);
    }
    return isFileHaveHelloWorld;
}
private boolean checkFileExisits(File file){
    return file.exists();
}
private String getFileContent(File file) throws FileNotFoundException {
    Scanner fileScanner = new Scanner(file);
    String fileContent = "";
    while (fileScanner.hasNext()){
        fileContent = fileContent + fileScanner.nextLine();
    }
    return fileContent;
}
private boolean checkStringHaveHelloWorld(String content){
    content = content.replaceAll("\n", "");
    return content.matches(".*Hello world.*");
}

我們先不看其他方法,單就看searchFileHaveHelloWorld。
首先跟重構前一樣在第3行建立file物件。
第5行確認檔案存在(checkFileExisits)。
第6行取得檔案內容。
第7行確認字串是否有hello world。
比對後會發現我們只需要看一行就知道它做了甚麼事情,在閱讀與解釋流程的時候會快上許多。
其他function的部份我們可以完全不考慮流程單獨看或檢查程式碼。
這部份除了會方便程式碼閱讀外對於正在開發的人來說也會輕鬆很多,主要有以下幾點:

方便加入unit test

由於每個方法只有做一件事情,因此當要撰寫unit test的時候可以更加專注在該項功能,不須考慮其他連鎖效應。

總結

各位讀者抱歉,我的毅力實在是太差了,導致有一天中斷了。
重新審視這短短的不到一個禮拜,感覺我還太嫩了,每天產文章有困難。
不過clean code的內容還有很多想要跟大家一起討論的。
因此這邊有個想法:
我預計會繼續寫clean code,但時間改成每週兩次,並且將內容也會一起放進blogger裡面。
或許大家沒有辦法每天討論到clean code的議題,但還請大家多多支持!!
Blogger:https://craterzeroandonez.blogspot.com/?m=1
P.S.目前還沒有把東西放進blogger,預計這幾天會把文章搬過去。還請大家稍等一下。


上一篇
#函式
系列文
為這美好世界獻上clean code!!5
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言